﻿//using ALEXBlog.Common.Attributes;
//using Castle.DynamicProxy;
//using System;
//using System.Linq;
//using System.Threading.Tasks;

namespace ALEXBlog.Extensions.Interceptors
{
    //    public class CacheInterceptor : IAsyncInterceptor
    //    {
    //        private ICaching Caching;

    //        public CacheInterceptor(ICaching caching)
    //        {
    //            Caching = caching;
    //        }

    //        /// <summary>
    //        /// 拦截器
    //        /// </summary>
    //        /// <param name="invocation"></param>
    //        public void InterceptSynchronous(IInvocation invocation)
    //        {
    //            if (MethodCacheAttributeChacking(invocation) is not null)
    //            {
    //                CacheInterceptHandle(invocation);
    //            }
    //            else
    //            {
    //                invocation.Proceed();
    //            }
    //        }

    //        public void InterceptAsynchronous(IInvocation invocation)
    //        {
    //            if (MethodCacheAttributeChacking(invocation) is not null)
    //            {
    //                CacheInterceptHandle(invocation, CompleterdFunc: (ivo, obj) =>
    //                {
    //                    ivo.ReturnValue = (Task)obj;
    //                });
    //            }
    //            else
    //            {
    //                invocation.Proceed();
    //            }
    //        }

    //        public void InterceptAsynchronous<TResult>(IInvocation invocation)
    //        {
    //            if (MethodCacheAttributeChacking(invocation) is not null)
    //            {
    //                CacheInterceptHandle(invocation, CompleterdFunc: (ivo, obj) =>
    //               {
    //                   ivo.ReturnValue = (Task<TResult>)obj;
    //               });
    //            }
    //            else
    //            {
    //                invocation.Proceed();
    //            }
    //        }

    //        public CacheAttribute MethodCacheAttributeChacking(IInvocation invocation)
    //        {
    //            var method = invocation.MethodInvocationTarget ?? invocation.Method;
    //            //对当前方法的特性进行验证
    //            var cacheAttribute = method.GetCustomAttributes(true).FirstOrDefault(x => x.GetType() == typeof(CacheAttribute)) as CacheAttribute;
    //            return cacheAttribute;
    //        }

    //        public void CacheInterceptHandle(IInvocation invocation, Action<IInvocation, object> CompleterdFunc = null)
    //        {
    //            //获取自定义缓存键
    //            var cacheKey = CustomCacheKey(invocation);

    //            //根据Key值取值
    //            var cacheValue = Caching.Get(cacheKey);
    //            if (cacheValue != null)
    //            {
    //                //将当前获取到的缓存值，复制给当前执行的方法并返回 
    //                if (CompleterdFunc is not null)
    //                {
    //                    CompleterdFunc.Invoke(invocation, cacheValue);
    //                }
    //                invocation.ReturnValue = cacheValue;
    //                return;
    //            }

    //            //若此键值无缓存，则继续执行
    //            invocation.Proceed();

    //            //存入缓存
    //            Caching.Set(cacheKey, invocation.ReturnValue);
    //        }

    //        //自定义缓存键
    //        public string CustomCacheKey(IInvocation invocation)
    //        {
    //            var typeName = invocation.TargetType.Name;
    //            var methodName = invocation.Method.Name;

    //            //获取参数列表
    //            var methodArgument = invocation.Arguments.Select(x => x.ToString());

    //            string key = $"{typeName}:{methodName}:";
    //            foreach (var item in methodArgument)
    //            {
    //                key += $"{item}";
    //            }
    //            return key.Trim();
    //        }

    //    }
}
